import openpyxl
import openpyxl.styles
import os


def get_data_all(excel_name, sheet_name):
    """
    获取所有的数据，输出为字典headers/body 2个数据输出时已处理为字典格式
    :param excel_name:  excel名字
    :param sheet_name:  sheet页名字
    :return:  返回列表
    """
    # 获取当前文件路径
    current_path = os.path.abspath(__file__)
    path_list = current_path.split("common")
    excel_path = str(path_list[0]) + "testData\\%s" % excel_name + ".xlsx"
    wb = openpyxl.load_workbook(excel_path)  # 打开excel
    sheet_names = wb.sheetnames  # 获取所有表名
    data_sheet = None  # 初始化变量
    for i in range(len(sheet_names)):
        if sheet_names[i] == sheet_name:
            data_sheet = wb[sheet_names[i]]  # 打开指定名字的工作表
            break
        elif i == (len(sheet_names)-1):  # 没找到相应的sheet_name
            raise Exception("%s文件中未找到sheet_name为%s的工作表" % (excel_name, sheet_name))

    # 获取第1行的所有数据
    list_data_sheet_row_1 = []
    for i in data_sheet[1]:
        list_data_sheet_row_1.append(i.value)

    # 读取所有数据
    list_data_sheet_all = []
    row_num = 1
    for row in data_sheet.rows:
        i = 0
        row_dic = dict()
        if row_num == 1:  # 去除第一行数据
            row_num += 1
            continue
        for cell in row:
            if list_data_sheet_row_1[i] == "params" \
                    or list_data_sheet_row_1[i] == "headers" \
                    or list_data_sheet_row_1[i] == "body":
                if cell.value:
                    # 处理headers和body中的数据为字典形式
                    row_dic[list_data_sheet_row_1[i]] = eval(cell.value.replace("\n", "").replace(" ", ""))
            else:
                row_dic[list_data_sheet_row_1[i]] = cell.value  # 将每行的数据放在row_dic临时字典中
            i += 1
        list_data_sheet_all.append(row_dic)   # 将每行的数据字典append到所有数据的列表中
    wb.close()  # 关闭excel
    return list_data_sheet_all


def get_param_by_key(data_all, url_key, param=None):
    """
    以url_key为唯一键，传入url_key，获取param对应的值，未传param则以字典格式返回整行的数据
    例：url_key=getbookbytype，param=name，返回数据为 ‘首页书单’
    :param data_all:  全部数据，字典格式
    :param url_key:  url的key，如有多个相同的url可以，则以列表形式返回多行数据
    :param param: 获取param对应的值，未传param则以字典格式返回整行的数据
    :return: 返回列表
    """
    result = []
    for i in range(len(data_all)):
        if data_all[i]["url_key"] == url_key:
            if param:
                result.append(data_all[i][param])
            else:
                result.append(data_all[i])
    if not result:  # 没找到url_key则报错
        raise Exception("excel中未找到url_key：%s的数据！" % url_key)
    return result
